home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 5 / Amiga Plus Sonderheft 1996 #5.iso / programme / picturedt_v43 / demo / pbm / libstuff.asm < prev    next >
Assembly Source File  |  1986-04-25  |  3KB  |  214 lines

  1. ;
  2. ;    ILBM Datatype
  3. ;
  4. ;    (c) Copyright 1995-1996 by Matthias Scheler
  5. ;        All Rights Reserved
  6. ;
  7.  
  8.         IFD BARFLY
  9.          CODE
  10.          SMALLDATA a4
  11.         ELSE
  12.          CSECT text,0
  13.         ENDC
  14.  
  15.         NOLIST
  16.         INCLUDE "exec/types.i"
  17.         INCLUDE "exec/libraries.i"
  18.         INCLUDE "exec/resident.i"
  19.         INCLUDE "exec/initializers.i"
  20.         INCLUDE "exec/semaphores.i"
  21.         INCLUDE    "dos/dos.i"
  22.         LIST
  23.  
  24. ; Macros
  25.  
  26. XLIB:        MACRO
  27.         XREF _LVO\1
  28.         ENDM
  29.  
  30. CALL:        MACRO
  31.         jsr _LVO\1(a6)
  32.         ENDM
  33.  
  34. ; External References
  35.  
  36.         XREF    _LinkerDB
  37.         XREF    _SysBase
  38.  
  39.         XREF    _InitPBMBase
  40.         XREF    _ReleasePBMBase
  41.  
  42.         XLIB    Remove
  43.         XLIB    FreeMem
  44.         XLIB    CloseLibrary
  45.         XLIB    OpenLibrary
  46.         XLIB    InitSemaphore
  47.         XLIB    ObtainSemaphore
  48.         XLIB    ReleaseSemaphore
  49.  
  50. ;    our Library Structure
  51.  
  52.         STRUCTURE PBM_DataType,LIB_SIZE
  53.         BPTR    PB_SegList
  54.         APTR    PB_Class
  55.         STRUCT    PB_Semaphore,SS_SIZE
  56.         LABEL    PB_SIZE
  57.  
  58. ;    Program Code
  59.  
  60.         moveq    #-1,d0
  61.         rts
  62.  
  63. ;    Library Resident Module Tag
  64.  
  65. VERSION        EQU    43    ; PBM_ID !
  66. REVISION    EQU    7    ; PBM_ID !
  67.  
  68. LibResTag:    dc.w    RTC_MATCHWORD
  69.         dc.l    LibResTag
  70.         dc.l    LibResTag+RT_SIZE
  71.         dc.b    RTF_AUTOINIT
  72.         dc.b    VERSION
  73.         dc.b    NT_LIBRARY
  74.         dc.b    0
  75.         dc.l    PBM_Name,PBM_ID
  76.         dc.l    LibInit
  77.  
  78. PBM_Name:    dc.b    "pbm.datatype",0
  79. PBM_ID:        dc.b    "PBM datatype 43.7 "
  80.         dc.b    "(c) 1995-1996 by Matthias Scheler",0
  81.         ds.w    0
  82.  
  83. ;    Initialization Table for Library Structure
  84.  
  85. LibInit:    dc.l    PB_SIZE
  86.         dc.l    FuncTab
  87.         dc.l    DataTab
  88.         dc.l    Init
  89.  
  90. FuncTab:    dc.l    Open
  91.         dc.l    Close
  92.         dc.l    Expunge
  93.         dc.l    ReturnNull
  94.  
  95.         dc.l    ObtainPBMMachine
  96.  
  97.         dc.l    -1
  98.  
  99. DataTab:    INITBYTE LN_TYPE,NT_LIBRARY
  100.                 INITLONG LN_NAME,PBM_Name
  101.                 INITBYTE LIB_FLAGS,LIBF_SUMUSED+LIBF_CHANGED
  102.                 INITWORD LIB_VERSION,VERSION
  103.                 INITWORD LIB_REVISION,REVISION
  104.                 INITLONG LIB_IDSTRING,PBM_ID
  105.                 dc.l    0
  106.  
  107. ; Init Function
  108.  
  109. Init:        movem.l    a4/a5,-(sp)
  110.         lea    _LinkerDB,a4
  111.  
  112.         move.l    d0,a5
  113.         move.l    a0,PB_SegList(a5)
  114.         move.l    a6,_SysBase(a4)
  115.  
  116.         lea    PB_Semaphore(a5),a0
  117.         CALL    InitSemaphore
  118.  
  119.         move.l    a5,d0
  120.         movem.l    (sp)+,a4/a5
  121.         rts
  122.  
  123. ; Open Function
  124.  
  125. Open:        movem.l    d2/a4-a6,-(sp)
  126.         lea    _LinkerDB,a4
  127.         move.l    a6,d2
  128.         move.l    a6,a5
  129.         move.l    _SysBase(a4),a6
  130.  
  131.         bclr    #LIBB_DELEXP,LIB_FLAGS(a5)
  132.         addq.w    #1,LIB_OPENCNT(a5)
  133.  
  134.         lea    PB_Semaphore(a5),a0
  135.         CALL    ObtainSemaphore
  136.  
  137.         tst.l    PB_Class(a5)
  138.         bne.s    GotClass
  139.  
  140.         move.l    d2,-(sp)
  141.         bsr    _InitPBMBase
  142.         addq.w    #4,sp
  143.         move.l    d0,d2
  144.         bne.s    GotClass
  145.  
  146.         subq.w    #1,LIB_OPENCNT(a5)
  147.  
  148. GotClass:    lea    PB_Semaphore(a5),a0
  149.         CALL    ReleaseSemaphore
  150.  
  151.         move.l    d2,d0
  152.         movem.l    (sp)+,d2/a4-a6
  153.         rts
  154.  
  155. ; Close Function
  156.  
  157. Close:        subq.w    #1,LIB_OPENCNT(a6)
  158.         bne.s    ReturnNull
  159.  
  160.         btst    #LIBB_DELEXP,LIB_FLAGS(a6)
  161.         bne.s    TimeToGo
  162.  
  163. ReturnNull:    moveq    #0,d0
  164.         rts
  165.  
  166. ; Expunge Function
  167.  
  168. Expunge:        tst.w    LIB_OPENCNT(a6)
  169.                 beq.s    TimeToGo
  170.  
  171.                 bset    #LIBB_DELEXP,LIB_FLAGS(a6)
  172.                 bra.s    ReturnNull
  173.  
  174. TimeToGo:    movem.l d2/a4-a6,-(sp)
  175.         lea    _LinkerDB,a4
  176.  
  177.         tst.l    PB_Class(a6)
  178.         beq.s    ClassNotBusy
  179.  
  180.         move.l    a6,-(sp)
  181.         bsr    _ReleasePBMBase
  182.         addq.w    #4,sp
  183.  
  184.         tst.l    d0
  185.         bne.s    ClassNotBusy
  186.         movem.l    (sp)+,d2/a4-a6
  187.         rts
  188.  
  189. ClassNotBusy:    move.l    a6,a5
  190.         move.l    PB_SegList(a5),d2
  191.  
  192.         move.l    _SysBase(a4),a6
  193.         move.l    a5,a1
  194.         CALL    Remove
  195.  
  196.         move.l    a5,a1
  197.         moveq    #0,d0
  198.         move.w    LIB_NEGSIZE(a5),d0
  199.         sub.w    d0,a1
  200.         add.w    LIB_POSSIZE(a5),d0
  201.         CALL    FreeMem
  202.  
  203.         move.l    d2,d0
  204.         movem.l    (sp)+,d2/a4-a6
  205.         rts
  206.  
  207. ; Our own function
  208.  
  209. ObtainPBMMachine:
  210.         move.l PB_Class(a6),d0
  211.         rts
  212.  
  213.         END
  214.